Skip to content

9.13 视图操作

9.13.1 关于视图

视图是数据库中非常重要的对象,是一张虚拟表,通过视图我们可以对结果进行筛选缓存,同时还能实现颗粒化权限控制,如控制指定行,指定列。

9.13.2 视图的使用

Furion 中实现视图的操作非常简单,只需要创建视图模型,并继承 EntityNotKey 基类即可。代码如下:

9.13.2.1 创建视图 SQL

CREATE VIEW V_Person AS  
SELECT Id,Name,Age,Address FROM person  

9.13.2.2 视图模型

using Furion.DatabaseAccessor;  

namespace Furion.Core  
{  
    public class V_Person : EntityNotKey  
    {  
        /// <summary>  
        /// 配置视图名  
        /// </summary>  
        public V_Person() : base("V_Person")  
        {  
        }  

        /// <summary>  
        /// 主键Id  
        /// </summary>  
        public int Id { get; set; }  

        /// <summary>  
        /// 姓名  
        /// </summary>  
        public string Name { get; set; }  

        /// <summary>  
        /// 年龄  
        /// </summary>  
        public int Age { get; set; }  

        /// <summary>  
        /// 住址  
        /// </summary>  
        public string Address { get; set; }  
    }  
}  

视图名称视图实体只需要继承 EntityNotKey 基类并编写无参构造函数继承 base("视图名称") 即可。

9.13.3 视图使用

视图除了不能操作(写)以外,其他操作和表操作无异。

var vEntities = v_repository.Where(u => u.Id >10).ToList();  

9.13.4 视图最佳读取方式 ✔

由于视图是虚拟表,不应该对其进行写操作,所以应该采用 只读仓储初始化视图

using Furion.Core;  
using Furion.DatabaseAccessor;  
using Furion.DynamicApiController;  
using System.Collections.Generic;  
using System.Threading.Tasks;  

namespace Furion.Application.Persons  
{  
    public class FurionService : IDynamicApiController  
    {  
        private readonly IReadableRepository<V_Person> _readableRepository;  

        public FurionService(IRepository<V_Person> repository)  
        {  
            // 初始化只读仓储  
            _readableRepository = repository.Constraint<IReadableRepository<V_Person>>();  
        }  

        /// <summary>  
        /// 读取视图  
        /// </summary>  
        /// <returns></returns>  
        public async Task<List<V_Person>> GetVPerson()  
        {  
            var list = await _readableRepository.AsQueryable().ToListAsync();  
            return list;  
        }  
    }  
}  

小知识通过 .Constraint<TEntity,TDbContextLocator> 方法可以将仓储约束为特定仓储,如只读仓储,可读可写仓储,只新增仓储等。

9.13.5 反馈与建议

与我们交流给 Furion 提 Issue